home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / MATHEMAT / STATISTI / 0910.ZIP / STAT-SAK.FOR < prev   
Text File  |  1987-02-11  |  56KB  |  1,902 lines

  1. C                                 STAT-SAK
  2. C                            The Statistician's
  3. C                             Swiss Army Knife   
  4. C                               Version 2.15
  5. C                            February 11, 1987
  6. C
  7. C                       "One of many STATOOLS(tm)..."
  8. C                                    by
  9. C
  10. C                             Gerard E. Dallal
  11. C                             53 Beltran Street
  12. C                             Malden, MA  02148
  13. C
  14. C
  15. C                                  NOTICE
  16. C
  17. C       Documentation and original code  copyright  1985  and 1986 by  
  18. C       Gerard E. Dallal. Reproduction of material for non-commercial
  19. C       purposes is permitted, without charge, provided that suitable 
  20. C       reference is made to STAT-SAK and its author.  
  21. C
  22. C       Neither  STAT-SAK nor its documentation should be modified in 
  23. C       any way without permission from the author,  except for those 
  24. C       changes  that  are  essential  to move   STAT-SAK to  another 
  25. C       computer.  
  26. C
  27.       CHARACTER*2 QUERY
  28.       DATA IIN /0/, IOUT /0/, NOPT /10/, QUERY /'  '/
  29. C
  30.       WRITE(IOUT,1)
  31.     1 FORMAT (////35X,'STAT-SAK'/
  32.      *   30X,'The Statistician''s'/
  33.      *   31X,'Swiss Army Knife'/
  34.      *   33X,'Version 2.15'/29X,'(c) 1985, 1986, 1987'//
  35.      *   26X,'"One of many STATOOLS(tm)..."'/
  36.      *   38X,'by'//
  37.      *   31X,'Gerard E. Dallal'/
  38.      *   31X,'53 Beltran Street'/
  39.      *   31X,'Malden, MA  02148'/////)
  40. C
  41.    30 WRITE(IOUT,40) 
  42.    40 FORMAT (/' Enter ''Q'' to quit, press  <ENTER>  to continue:  '$)
  43.       READ (IIN,50) QUERY
  44.    50 FORMAT (A2)
  45.    55 CALL UPCASE(QUERY)
  46.       IF (QUERY.EQ.'Q ') STOP ' '
  47.       IF (QUERY.EQ.'  ') GOTO 60
  48.       CALL OPTION(QUERY,NPICK)
  49.       
  50.       IF (NPICK.LT.1 .OR. NPICK.GT.NOPT) GOTO 60
  51. C
  52.       GOTO (100,200,300,400,500,600,700,800,900,1000), NPICK
  53. C
  54.  
  55. C
  56.    60 WRITE(IOUT,70)
  57.    70 FORMAT(/' Your options are:'//
  58.      *        '  DF -- distribution functions'/
  59.      *        '  CT -- independence in ',
  60.      *        'two-dimensional contingency tables'/
  61.      *        '  FI -- Fisher''s exact test for 2*2 tables'/
  62.      *        '  MH -- Mantel-Haenszel test / odds ratios'/
  63.      *        '  MC -- McNemar''s test'/
  64.      *        '  CC -- correlation coefficients'/
  65.      *        '  BP -- Bartholomew''s test for increasing proportions'/
  66.      *        '  BM -- Bartholomew''s test for increasing means'/
  67.      *        '  T1 -- one sample t-test from summary statistics'/
  68.      *        '  T2 -- two sample t-test from summary statistics'/)
  69. C
  70.       WRITE(IOUT,80)
  71.    80 FORMAT(' Your choice?:  ',$)
  72.       READ(IIN,50) QUERY
  73.       GOTO 55
  74. C
  75.   100 CALL PROB(IIN,IOUT)
  76.       GOTO 30
  77. C
  78.   200 CALL GOF(IIN,IOUT)
  79.       GOTO 30
  80. C
  81.   300 CALL MANTEL(IIN,IOUT)
  82.       GOTO 30
  83. C
  84.   400 CALL MCNEMR(IIN,IOUT)
  85.       GOTO 30 
  86. C
  87.   500 CALL CORR(IIN,IOUT)
  88.       GOTO 30
  89. C
  90.   600 CALL BART(IIN,IOUT)
  91.       GOTO 30
  92.   700 CALL TTEST1(IIN,IOUT)
  93.       GOTO 30
  94. C
  95.   800 CALL TTEST2(IIN,IOUT)
  96.       GOTO 30
  97. C
  98.   900 CALL OMEANS(IIN,IOUT)
  99.       GOTO 30
  100. C
  101.  1000 CALL FISHER(IIN,IOUT)
  102.       GOTO 30
  103. C
  104.       END
  105. C
  106.       SUBROUTINE UPCASE(TEXT)
  107.       CHARACTER*2 TEXT
  108.       CHARACTER*26 UPPER, LOWER
  109.       DATA UPPER / 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' /
  110.       DATA LOWER / 'abcdefghijklmnopqrstuvwxyz' /
  111. C
  112.       DO 100 I = 1, 2
  113.       IF (TEXT(I:I).LE.'Z' .OR. TEXT(I:I).EQ.' ') GOTO 100
  114.       DO 90 K = 1, 26
  115.       IF (TEXT(I:I).NE.LOWER(K:K)) GOTO 90
  116.       TEXT(I:I) = UPPER(K:K)
  117.       GOTO 100
  118.    90 CONTINUE
  119.   100 CONTINUE
  120.       RETURN
  121.       END
  122. C
  123.       SUBROUTINE OPTION(TEXT,NO)
  124. C
  125.       CHARACTER*2 TEXT, LIST(10)
  126.       DATA NOPT /10/
  127. C      
  128.       DATA LIST(1), LIST(2), LIST(3), LIST(4)
  129.      *   /    'DF',    'CT',    'MH',    'MC'/
  130.       DATA LIST(5), LIST(6), LIST(7), LIST(8), LIST(9), LIST(10)
  131.      *  /     'CC',    'BP',    'T1',    'T2',    'BM',     'FI'/
  132. C
  133.       DO 100 I = 1, NOPT
  134.       NO = I
  135.       IF (TEXT.EQ.LIST(I)) RETURN
  136.   100 CONTINUE
  137.       NO = NO + 1
  138.       RETURN
  139.       END
  140. C
  141.       FUNCTION ALGAMA(S)
  142. C
  143. C        CACM ALGORITHM 291
  144. C        LOGARITHM OF GAMMA FUNCTION
  145. C        BY PIKE, M.C. AND HILL, I.D.
  146. C
  147. C        TRANSLATED INTO FORTRAN BY
  148. C                   Gerard E. Dallal
  149. C                   USDA-Human Nutrition Research Center on Aging
  150. C                              at Tufts University
  151. C                   711 Washington Street
  152. C                   Boston, MA  02111
  153. C
  154. C
  155.       X = S
  156.       ALGAMA = 0.0
  157.       IF (X .LE. 0.0) RETURN
  158.       F = 0.0
  159.       IF (X .GE. 7.0) GOTO 30
  160. C
  161.       F = 1.0
  162.       Z = X - 1.0
  163. C
  164.    10 Z = Z + 1.0
  165.       IF (Z .GE. 7.0) GOTO 20
  166.       X = Z
  167.       F = F * Z
  168.       GOTO 10
  169. C
  170.    20 X = X + 1
  171.       F = -ALOG(F)
  172. C
  173.    30 Z = 1.0 / X ** 2
  174.       ALGAMA = F + ( X - 0.5) * ALOG(X) - X + 0.918938533204673 +
  175.      1   (((-0.000595238095238 * Z + 0.000793650793651) * Z
  176.      2   - 0.002777777777778) * Z + 0.083333333333333) / X
  177.       RETURN
  178.       END
  179. C
  180.       FUNCTION ALNORM(X,UPPER)
  181. C
  182. C        ALGORITHM AS 66 APPL. STATIST. (1973) VOL.22, NO.3
  183. C
  184. C        EVALUATES THE TAIL AREA OF THE STANDARD NORMAL CURVE
  185. C        FROM X TO INFINITY IF UPPER IS .TRUE. OR
  186. C        FROM MINUS INFINITY TO X IF UPPER IS .FALSE.
  187. C
  188.       REAL LTONE, UTZERO, ZERO, HALF, ONE, CON, Z, Y, X
  189.       LOGICAL UPPER, UP
  190. C
  191. C        LTONE AND UTZERO MUST BE SET TO SUIT THE PARTICULAR
  192. C        COMPUTER (SEE INTRODUCTORY TEXT)
  193. C
  194.       DATA LTONE, UTZERO/7.0, 18.66/
  195.       DATA ZERO, HALF, ONE, CON/0.0, 0.5, 1.0, 1.28/
  196.       UP = UPPER
  197.       Z = X
  198.       IF (Z .GE. ZERO) GOTO 10
  199.       UP = .NOT. UP
  200.       Z = -Z
  201.    10 IF (Z .LE. LTONE .OR. UP .AND. Z .LE. UTZERO) GOTO 20
  202.       ALNORM = ZERO
  203.       GOTO 40
  204.    20 Y = HALF * Z * Z
  205.       IF (Z .GT. CON) GOTO 30
  206. C
  207.       ALNORM = HALF - Z * (0.398942280444 - 0.399903438504 * Y /
  208.      1   (Y + 5.75885480458 - 29.8213557808 /
  209.      2   (Y + 2.62433121679 + 48.6959930692 /
  210.      3   (Y + 5.92885724438))))
  211.       GOTO 40
  212. C
  213.    30 ALNORM = .398942280385 * EXP(-Y) /
  214.      1   (Z - 3.8052E-8 + 1.00000615302 /
  215.      2   (Z + 3.98064794E-4 + 1.98615381364 /
  216.      3   (Z - 0.151679116635 + 5.29330324926 /
  217.      4   (Z + 4.8385912808 - 15.1508972451 /
  218.      5   (Z + 0.742380924027 + 30.789933034 / (Z + 3.99019417011))))))
  219. C
  220.    40 IF (.NOT. UP) ALNORM = ONE - ALNORM
  221.       RETURN
  222.       END
  223. C
  224.       SUBROUTINE BART(IIN,IOUT)
  225. C
  226. C              BARTHOLOMEW'S TEST FOR ORDERED SAMPLES (INCREASING)
  227. C
  228.       DIMENSION CT(10),X(2,10),P(10)
  229.       CHARACTER*1 QUERY
  230. C
  231.     3 WRITE(IOUT,4)
  232.     4 FORMAT(/' Enter the number of columns [.LE.10]:  ',$)
  233.       READ(IIN,*,ERR=3) NCOL
  234.       IF(NCOL.LT.2 .OR. NCOL.GT.10) GOTO 3
  235. C
  236.     8 WRITE (IOUT,9)
  237.     9 FORMAT(' Do you wish to enter two rows (R) or ',
  238.      *       'one row with column totals (T)?:  '$)
  239.       READ (IIN,10) QUERY
  240.    10 FORMAT(A1)
  241.       IF (QUERY.NE.'R' .AND. QUERY.NE.'r' .AND. 
  242.      *   QUERY.NE.'T' .AND. QUERY.NE.'t') GO TO 8
  243. C
  244.       WRITE (IOUT,5)
  245.     5 FORMAT(' ')
  246.     6 WRITE(IOUT,7) 
  247.     7 FORMAT('         Enter row 1:  ',$)
  248.       READ(IIN,*,ERR=6) (X(1,J), J = 1, NCOL)
  249.       IF (QUERY.EQ.'2') GOTO 16
  250. C
  251.       IF (QUERY.EQ.'R' .OR. QUERY.EQ.'r') GOTO 16
  252.    11 WRITE (IOUT,12)
  253.    12 FORMAT(' Enter column totals:  ',$)
  254.       READ(IIN,*,ERR=11) (CT(J), J = 1, NCOL)
  255.       GOTO 18
  256. C
  257.    16 WRITE(IOUT,17) 
  258.    17 FORMAT('         Enter row 2:  ',$)
  259.       READ(IIN,*,ERR=16) (X(2,J), J = 1, NCOL)
  260. C
  261. C              GET COL TOTALS AND P'S
  262. C
  263.    18 PNUM=0.
  264.       PDEN=0.
  265.       DO 19 J=1,NCOL
  266.       IF (QUERY.EQ.'R' .OR. QUERY.EQ.'r') CT(J)=X(1,J)+X(2,J)
  267.       P(J)=X(1,J)/CT(J)
  268.       PNUM=PNUM+X(1,J)
  269.       PDEN=PDEN+CT(J)
  270.    19 CONTINUE
  271.       PBAR=PNUM/PDEN
  272. C
  273. C              PEARSON CHI-SQUARE STATISTIC
  274. C
  275.       PX2 = 0.0
  276.       DO 25 J = 1, NCOL
  277.       E11 = PBAR * CT(J)
  278.       PX2 = Px2 + (X(1,J) - E11)**2 * (1.0 / E11 + 1.0 / (CT(J) - E11))
  279.    25 CONTINUE
  280. C
  281. C              BARTHOLOMEW'S TEST
  282. C              FIRST MASSAGE TABLE
  283. C
  284.       DO 50 J=2,NCOL
  285.       IF (P(J-1).LE.P(J)) GO TO 50
  286. C
  287. C              P DECREASES...DETERMINE VALUE BY 'COLLAPSING'
  288. C              SO THAT SEQUENCE IS MONOTONE
  289. C
  290.       PNUM=P(J-1)*CT(J-1)+P(J)*CT(J)
  291.       PDEN=CT(J-1)+CT(J)
  292.       PX=PNUM/PDEN
  293. C
  294. C              IS IT NECESSARY TO GO FURTHER BACK?
  295. C
  296.       JS=J-1
  297.       IF (JS.EQ.1) GO TO 30
  298.       JM2=J-2
  299.       DO 29 I=1,JM2
  300.       IF (P(JS-1).LE.PX) GO TO 30
  301.       JS=JS-1
  302.       PNUM=PNUM+P(JS)*CT(JS)
  303.       PDEN=PDEN+CT(JS)
  304.       PX=PNUM/PDEN
  305.    29 CONTINUE
  306.    30 DO 40 J1=JS,J
  307.    40 P(J1)=PX
  308.    50 CONTINUE
  309. C
  310. C              CALCULATE STATISTIC
  311. C
  312.       CHISQ=0.
  313.       DO 70 J=1,NCOL
  314.    70 CHISQ=CHISQ+CT(J)*(P(J)-PBAR)**2
  315.       CHISQ=CHISQ/(PBAR*(1.-PBAR))
  316. C
  317.       WRITE (IOUT,80)CHISQ
  318.    80 FORMAT(/' Chi-square statistic for order restriction = ',G11.4)
  319. C
  320. C              INDICES FOR USE WITH TABLES
  321. C
  322.       CALL PBART(CHISQ,PVAL,NCOL,DIFF,2,CT)
  323.       IF (NCOL.EQ.3 .OR. NCOL.EQ.4) WRITE(IOUT,90) PVAL
  324.    90 FORMAT ('                            P-value (exact) = ',F7.3)
  325.       IF (NCOL.NE.3 .AND.NCOL.NE.4) WRITE(IOUT,100) PVAL
  326.   100 FORMAT ('           P-value (assuming equal weights) = ',F7.3)
  327. C
  328.   200 DIFF = PX2 - CHISQ
  329.       PDIFF = CHIDFC(DIFF,NCOL-1)
  330.       WRITE(IOUT,210) PX2, DIFF, PDIFF
  331.   210 FORMAT(/' Pearson chi-square statistic =',F8.2,5X,
  332.      * /'     Difference (lack of fit) =',F8.2,5X,'(P-value <',F6.3,')')
  333. C
  334.       RETURN
  335.       END
  336. C
  337.       FUNCTION BETAIN(X,P,Q)
  338. C
  339. C        ALGORITHM AS 63  APPL.STATIST. (1973), VOL.22, NO.3
  340. C        MODIFIED AS PER REMARK ASR 19  (1977), VOL.26, NO. 1
  341. C        ***[FAULT INDICATOR REMOVED BY G.E.D.]***
  342. C
  343. C        COMPUTES INCOMPLETE BETA FUNCTION RATIO FOR ARGUMENTS
  344. C        X BETWEEN ZERO AND ONE, P AND Q POSITIVE.
  345. C        LOG OF COMPLETE BETA FUNCTION, BETA, ASSUMED TO BE KNOWN.
  346. C        ***[CALCULATION OF BETA ADDED BY G.E.D]***
  347. C
  348.       LOGICAL INDEX
  349. C
  350. C        DEFINE ACCURACY AND INITIALIZE
  351. C
  352.       DATA ACU /0.1E-7/
  353.       BETAIN = X 
  354. C
  355. C        TEST FOR ADMISIBILITY OF AGRUMENTS
  356. C
  357.       IF (P .LE. 0.0 .OR. Q .LE. 0.0) STOP 40
  358.       IF (X .LT. 0.0 .OR .X .GT. 1.0) STOP 41
  359.       IF (X .EQ .0.0 .OR .X .EQ. 1.0) RETURN
  360. C
  361. C     CHANGE TAIL IF NECESSARY AND DETERMINE S
  362. C
  363.       PSQ = P + Q
  364.       CX = 1.0 - X
  365.       IF (P .GE .PSQ * X) GOTO 1
  366.       XX = CX
  367.       CX = X
  368.       PP = Q
  369.       QQ = P
  370.       INDEX = .TRUE.
  371.       GOTO 2
  372.     1 XX = X
  373.       PP = P
  374.       QQ = Q
  375.       INDEX = .FALSE.
  376.     2 TERM = 1.0
  377.       AI = 1.0
  378.       BETAIN = 1.0
  379.       NS = QQ + CX * PSQ
  380. C
  381. C        USE SOPER'S REDUCTION FORMULAE
  382. C
  383.       RX = XX / CX
  384.     3 TEMP = QQ - AI
  385.       IF (NS .EQ. 0) RX = XX
  386.     4 TERM = TERM * TEMP * RX / (PP + AI)
  387.       BETAIN = BETAIN + TERM
  388.       TEMP = ABS(TERM)
  389.       IF (TEMP .LE. ACU .AND. TEMP .LE. ACU * BETAIN) GOTO 5
  390.       AI = AI + 1.0
  391.       NS = NS - 1
  392.       IF (NS .GE. 0) GOTO 3
  393.       TEMP = PSQ
  394.       PSQ = PSQ + 1.0
  395.       GOTO 4
  396. C
  397. C        CALCULATE RESULT
  398. C
  399.     5 BETA = ALGAMA(P) + ALGAMA(Q) - ALGAMA(P+Q)
  400.       BETAIN = BETAIN * 
  401.      *     EXP(PP * ALOG(XX) + (QQ - 1.0) * ALOG(CX) - BETA) / PP
  402.       IF (INDEX) BETAIN = 1.0 - BETAIN
  403.       RETURN
  404.       END
  405. C
  406.       FUNCTION CHIDFC(X,NDF)
  407. C
  408. C        RETURNS P(CHISQ(NDF).GT.X), WHERE CHISQ(NDF) IS A CHI-SQUARE
  409. C        RANDOM VARIABLE WITH 'NDF' DEGREES OF FREEDOM.
  410. C
  411. C        IF  X.LE.0, RETURNS THE VALUE 1.0
  412. C
  413. C        UPPER TAIL RECURRENCE FORMULA...
  414. C           Q(X/NDF)=Q(X/NDF-2)+X**(NDF/2-1)*EXP(-X/2)/GAMMA(NDF/2),
  415. C              WHERE Q(X/NDF) IS THE UPPER TAIL, (X, INFINITY), OF THE
  416. C              CHI-SQUARE DISTRIBUTION WITH 'NDF' DEGREES OF FREEDOM.
  417. C        SEE HANDBOOK OF MATHEMATICAL FUNCTIONS,
  418. C        NBS,55(1964),26.4.8
  419. C
  420. C        USES WILSON-HILFERTY APPROXIMATION FOR NDF.GT.NDFBIG
  421. C        NBS HANDBOOK, 24.4.17
  422. C           (X/NDF)**(1./3.) IS APPROXIMATLEY NORMALLY DISTRIBUTED
  423. C           WITH MEAN 1.-2./(9.*NDF) AND VARIANCE 2./(9.*NDF)
  424. C
  425. C        REQUIRES FUNCTIONS ALNORM, ALGAMA
  426. C
  427. C        WRITTEN BY  Gerard E. Dallal
  428. C                    USDA-Human Nutrition Research Center on Aging
  429. C                               at Tufts University
  430. C                    711 Washington Street
  431. C                    Boston, MA  02111
  432. C
  433. C
  434. C        EXPBIG IS A NUMBER GREATER THAN THE MOST NEGATIVE VALID
  435. C           ARGUMENT TO THE EXP() FUNCTION.
  436. C
  437.       DATA NDFBIG /60/, EXPBIG /-80.0/
  438. C
  439.       CHIDFC = 1.0
  440.       IF (X .LE. 0.0 .OR. NDF .LT. 1) RETURN
  441.       CHIDFC = 0.
  442.       DF = NDF
  443.       IF (NDF .GT. NDFBIG) GOTO 50
  444.       HX = X / 2.0
  445.       IF ((NDF / 2) * 2 .EQ. NDF) GOTO 30
  446. C
  447. C        ODD NUMBER OF DEGREES OF FREEDOM
  448. C
  449.       IF (NDF .EQ. 1) GOTO 20
  450. C
  451.       INDEX = (NDF - 1) / 2
  452.       DO 10 I = 1, INDEX
  453.       C = FLOAT(I) + 0.5
  454.       D = (C - 1.0) * ALOG(HX) - HX - ALGAMA(C)
  455.       IF (D .GT. EXPBIG) CHIDFC = CHIDFC + EXP(D)
  456.    10 CONTINUE
  457.    20 CHIDFC = CHIDFC + 2.0 * ALNORM (SQRT(X), .TRUE.)
  458.       RETURN
  459. C
  460. C        EVEN NUMBER OF DEGREES OF FREEDOM
  461. C
  462.    30 INDEX = NDF / 2
  463.       DO 40 I = 1, INDEX
  464.       C = I
  465.       D =(C - 1.0) * ALOG(HX) - HX - ALGAMA(C)
  466.       IF (D .GT. EXPBIG) CHIDFC = CHIDFC + EXP(D)
  467.    40 CONTINUE
  468.       RETURN
  469. C
  470.    50 D = 2.0 / (9.0 * DF)
  471.       D = ((X / DF) ** (1.0 / 3.0) + D - 1.0) / SQRT(D)
  472.       CHIDFC = ALNORM(D, .TRUE.)
  473.       RETURN
  474.       END
  475. C
  476.       SUBROUTINE CORR(IIN,IOUT)
  477. C
  478.       CHARACTER*1 QUERY
  479. C
  480.    10 WRITE (IOUT,20)
  481.    20 FORMAT (/'   0 -- test that a population correlation '
  482.      *   'coefficient is zero'/
  483.      *         '   1 -- confidence interval for a single '
  484.      *   'correlation coefficient'/
  485.      *         '   2 -- compare two independent correlation '
  486.      *   'coefficients'//' Pick one:  ',$)
  487.       READ (IIN,30) QUERY
  488.    30 FORMAT (A1)
  489.       IF (QUERY.NE.'0' .AND. QUERY.NE.'1' .AND. QUERY.NE.'2') GOTO 10
  490. C
  491.       IF (QUERY.EQ.'0') CALL CORR0(IIN,IOUT)
  492.       IF (QUERY.EQ.'1') CALL CORR1(IIN,IOUT)
  493.       IF (QUERY.EQ.'2') CALL CORR2(IIN,IOUT)
  494.       RETURN
  495.       END
  496. C
  497.       SUBROUTINE CORR0(IIN,IOUT)
  498. C
  499.   110 WRITE(IOUT,120)
  500.   120 FORMAT(/' Enter sample correlation coefficient:  '$)
  501.       READ(IIN,*,ERR=110) R
  502.       IF(ABS(R).GT.1) GOTO 110
  503.   130 WRITE(IOUT,140)
  504.   140 FORMAT(' Enter number of observations:  '$)
  505.       READ(IIN,*,ERR=130) FN
  506.       IF (FN.LT.3.0) GOTO 130
  507. C
  508.       T = SQRT(FN - 2.0) * R / SQRT(1.0 - R**2)
  509.       NDF = FN - 2.0
  510.       P = FDFC(T**2,1.0,FLOAT(NDF))
  511.       WRITE (IOUT,210) T, NDF, P
  512.   210 FORMAT (
  513.      *   /'   t = ',G11.4,5X,'(',I4,' d.f.)',5X,'P-value = ',F6.4)
  514. C
  515.       RETURN
  516.       END
  517. C
  518.       SUBROUTINE CORR1(IIN,IOUT)
  519. C
  520. C        TWO-SIDED CONFIDENCE LIMITS FOR A POPULATION CORRELATION
  521. C        COEFFICIENT.  TRANSLATED FROM THE BASIC PROGRAM ON P.300 OF
  522. C          MAINDONALD, J.H.(1984)  STATISTICAL COMPUTATION.
  523. C          NEW YORK:  JOHN WILEY & SONS, INC.
  524. C
  525. C        USES APPROXIMATION FROM 
  526. C          WINTERBOTTOM, ALAN (1980).  ESTIMATION FOR THE BIVARIATE
  527. C          NORMAL CORRELATION COEFFICIENT USING ASYMPTOTIC EXPANSIONS 
  528. C
  529. C        THREE DIGIT ACCURACY FOR SAMPLES OF 10
  530. C        NEARLY FOUR DIGIT ACCURACY FOR SAMPLES OF 25 OR MORE     
  531. C
  532.       FNA(X,R,V,Z) = Z + X / SQRT(V) - R / (2.0 * V) + X * (X**2 +
  533.      *   3.0 * (1.0 + R**2)) / (12.0 * V * SQRT(V))
  534.       FNB(X,R,V) = R * (4.0 * (R * X)**2 + 5.0 * R**2 + 9.0) /
  535.      *   (24.0 * V**2)
  536.       FNC(X,R3,R4,V) = X * (X**4 + R3 * X**2 + R4) / 
  537.      *   (480.0 * V**2 * SQRT(V))
  538.       FNT(X,R,R3,R4,V,Z) = FNA(X,R,V,Z) - FNB(X,R,V) + FNC(X,R3,R4,V)
  539.       FNR(Z) = (EXP(2.0 * Z) - 1.0) / (EXP(2.0 * Z) + 1.0)
  540.  
  541. C
  542.    90 WRITE (IOUT,100)
  543.   100 FORMAT(/' Enter confidence level (0,1):  '$)
  544.       READ(IIN,*,ERR=90) CONF
  545.       IF (CONF.LE.0.0 .OR. CONF.GE.1.0) GOTO 90
  546.       Z0 = -GAUINV((1.0 - CONF)/ 2.0,IFAULT)
  547. C
  548.   110 WRITE(IOUT,120)
  549.   120 FORMAT(' Enter sample correlation coefficient'
  550.      *   'and number of observations:  '$)
  551.       READ(IIN,*,ERR=110) R,N2
  552.       IF(ABS(R).GE.1 .OR. N2.LE.2) GOTO 110
  553. C
  554.       V = N2 - 1
  555.       Z = 0.5 * ALOG((1.0 + R) / (1.0 - R))
  556.       R3 = 60.0 * R**4 - 30.0 * R**2 + 20.0
  557.       R4 = 165.0 * R**4 + 30.0 * R**2 + 15.0
  558.       X = -Z0
  559.       Z1 = FNT(X,R,R3,R4,V,Z)
  560.       X = Z0
  561.       Z2 = FNT(X,R,R3,R4,V,Z)
  562.       R1 = FNR(Z1)
  563.       R2 = FNR(Z2)
  564.       WRITE(IOUT,150) 100.0*CONF,R1,R2
  565.   150 FORMAT (/' The ',F4.1,'-% confidence interval is (',
  566.      *   F7.4,', ',F7.4,')')
  567.       RETURN
  568.       END
  569. C
  570.       SUBROUTINE CORR2(IIN,IOUT)
  571. C
  572. C             USES FISHER'S Z TO COMPARE TWO CORRELATION COEFFICENTS
  573. C
  574.    10 WRITE (IOUT,20) 
  575.    20 FORMAT(/' Enter first  correlation coefficient'
  576.      *   'and sample size:  '$)
  577.    30 READ (IIN,*,ERR=10) CC1, N1
  578.       IF(ABS(CC1).GE.1.0 .OR. N1.LE.2) GOTO 10
  579. C
  580.   110 WRITE (IOUT,120) 
  581.   120 FORMAT(/' Enter second correlation coefficient'
  582.      *   'and sample size:  '$)
  583.   130 READ (IIN,*,ERR=110) CC2, N2
  584.       IF(ABS(CC2).GE.1.0 .OR. N2.LE.2) GOTO 110
  585. C
  586. C
  587.       Z = 0.0
  588.       P = 0.0
  589.       IF (N1.LE.3 .OR. N2.LE.3) GOTO 400
  590. C
  591.       CC1 = 0.5 * ALOG((1.0 + CC1) / (1.0 - CC1))
  592.       CC2 = 0.5 * ALOG((1.0 + CC2) / (1.0 - CC2))
  593.       Z = ABS(CC1 - CC2)/ SQRT(1.0 / FLOAT(N1 - 3) + 
  594.      *   1.0 / FLOAT(N2 - 3))
  595.       P = 2.0 * ALNORM(Z,.TRUE.)
  596. C
  597.   400 WRITE(IOUT,410) Z, P
  598.   410 FORMAT (/' Test statistic = ',G11.4,'      P-value = ',F5.3)
  599.       RETURN
  600.       END
  601. C
  602.       FUNCTION FDFC(FQUAN, DFN, DFD)
  603. C
  604. C        THE COMPLEMENT OF THE CDF OF THE F DISTRIBUTION
  605. C        WITH DFN NUMERATOR DEGREES OF FREEDOM AND DFD DENOMINATOR 
  606. C        DEGREES OF FREEDOM EVALUATED AT FQUAN.
  607. C
  608. C
  609.       ESQ = DFD / (DFD + DFN * FQUAN)
  610.       FDFC = BETAIN (ESQ, DFD/2.0, DFN / 2.0)
  611.       RETURN
  612.       END
  613. C
  614.       SUBROUTINE FDFC0(IIN, IOUT, NPICK)
  615. C
  616. C        GET INFO FOR F-DISTRIBUTION CALCULATION
  617. C
  618.       IF(NPICK.EQ.1) GOTO 200
  619.    10 WRITE (IOUT,20)
  620.    20 FORMAT(/' Enter numerator degrees of freedom:  '$)
  621.       READ (IIN,*,ERR=10) DFN
  622.    30 WRITE (IOUT,40)
  623.    40 FORMAT(' Enter denominator degrees of freedom:  '$)
  624.       READ (IIN,*,ERR=30) DFD
  625.    50 WRITE (IOUT,60)
  626.    60 FORMAT(' Enter F quantile:  '$)
  627.       READ (IIN,*,ERR=50) FQUAN
  628.       PVAL = FDFC(FQUAN,DFN,DFD)
  629.       WRITE (IOUT,80) PVAL
  630.    80 FORMAT (/' Upper tail probability =',F8.5)
  631.       RETURN
  632. C
  633.   200 WRITE (IOUT,210)
  634.   210 FORMAT(/' Enter upper tail probability:  '$)
  635.       READ(IIN,*,ERR=200) PVAL
  636.       IF(PVAL.LT.0.0 .OR. PVAL.GT.1.0) GOTO 200
  637.   220 WRITE (IOUT,20)
  638.       READ (IIN,*,ERR=220) DFN
  639.   230 WRITE (IOUT,40)
  640.       READ (IIN,*,ERR=230) DFD
  641.       BETA = XINBTA(DFD/2.0,DFN/2.0,PVAL)
  642.       F = (1.0/BETA -1.0)*DFD/DFN
  643.       WRITE (IOUT,240) F
  644.   240 FORMAT(' Quantile:  ',G11.4)
  645.       RETURN   
  646.       END
  647. C
  648.       FUNCTION GAMAIN(X,P)
  649. C
  650. C        ALGORITHM AS 32 J.R.STATIST.SOC. C. (1970) VOL.19 NO.3
  651. C
  652. C        COMPUTES INCOMPLETE GAMMA RATIO FOR POSITIVE VALUES OF
  653. C        ARGUMENTS X AND P.  G MUST BE SUPPLIED AND SHOULD BE EQUAL TO
  654. C        LN(GAMMA(P)).
  655. C        IFAULT = 1 IF P.LE.0 ELSE 2 IF X.LT.0 ELSE 0
  656. C        USES SERIES EXPANSION IF P.GT.X OR X.LE.1, OTHERWISE A 
  657. C        CONTINUED FRACTION APPROXIMATION.C
  658. C
  659. C        [FAULT INDICATOR REMOVED BY G.E.D
  660. C        CALCULATION OF G INSERTED BY G.E.D.]
  661. C
  662.       DIMENSION PN(6)
  663. C
  664. C        DEFINE ACCURACY AND INITIALIZE
  665. C
  666.       ACU = 1.0E-8
  667.       OFLO = 1.0E30
  668.       GIN = 0.0
  669. C
  670. C        TEST FOR ADMISSIBILITY OF ARGUMENTS
  671. C
  672.       IF (P .LE. 0.0) STOP 21
  673.       IF (X .LT. 0.0) STOP 22
  674.       IF (X .EQ. 0.0) GOTO 50
  675.       G = ALGAMA(P)
  676.       FACTOR = EXP(P * ALOG(X) - X - G)
  677.       IF (X .GT. 1.0 .AND. X .GE. P) GOTO 30
  678. C
  679. C        CALCULATION BY SERIES EXPANSION
  680. C
  681.       GIN = 1.0
  682.       TERM = 1.0
  683.       RN = P
  684.    20 RN = RN + 1.0
  685.       TERM = TERM * X / RN
  686.       GIN = GIN + TERM
  687.       IF (TERM .GT. ACU) GOTO 20
  688.       GIN = GIN * FACTOR / P
  689.       GOTO 50
  690. C
  691. C        CALCULATION BY CONTINUED FRACTION
  692. C
  693.    30 A = 1.0 - P
  694.       B = A + X + 1.0
  695.       TERM = 0.0
  696.       PN(1) = 1.0
  697.       PN(2) = X
  698.       PN(3) = X + 1.0
  699.       PN(4) = X * B
  700.       GIN = PN(3) / PN(4)
  701.    32 A = A + 1.0
  702.       B = B + 2.0
  703.       TERM = TERM + 1.0
  704.       AN = A * TERM
  705.       DO 33 I = 1, 2
  706.    33 PN(I+4) = B * PN(I+2) - AN * PN(I)
  707.       IF (PN(6) .EQ. 0.0) GOTO 35
  708.       RN = PN(5) / PN(6)
  709.       DIF = ABS(GIN - RN)
  710.       IF (DIF .GT. ACU) GOTO 34
  711.       IF (DIF .LE. ACU * RN) GOTO 42
  712.    34 GIN = RN
  713.    35 DO 36 I = 1, 4
  714.    36 PN(I) = PN(I+2)
  715.       IF (ABS(PN(5)).LT.OFLO) GOTO 32
  716.       DO 41 I = 1, 4
  717.    41 PN(I) = PN(I) / OFLO
  718.       GOTO 32
  719.    42 GIN = 1.0 - FACTOR * GIN
  720. C
  721.    50 GAMAIN = GIN
  722.       RETURN
  723.       END
  724. C
  725.       FUNCTION GAUINV(P,IFAULT)
  726. C
  727. C              ALGORITHM AS 70 APPL. STATIST. (1974) VOL. 23, NO.1
  728. C              GAUINV FINDS PERCENTAGE POINTS OF THE NORMAL DISTRIBUTION
  729. C
  730.       DATA ZERO,ONE,HALF,ALIMIT/0.0, 1.0, 0.5, 1.0E-20/
  731. C
  732.       DATA             P0,  P1,             P2,                P3
  733.      1   / -.322232431088, -1., -.342242088547, -.204231210245E-1/
  734. C
  735.       DATA                P4,               Q0,            Q1
  736.      1   / -.453642210148E-4, .993484626060E-1, .588581570495/
  737. C
  738.       DATA            Q2,            Q3,              Q4
  739.      1   / .531103462366, .103537752850, .38560700634E-2/
  740. C
  741.       IFAULT=1
  742.       GAUINV=ZERO
  743.       PS=P
  744.       IF (PS.GT.HALF) PS=ONE-PS
  745.       IF (PS.LT.ALIMIT) RETURN
  746.       IFAULT=0
  747.       IF (PS.EQ.HALF) RETURN
  748.       YI=SQRT(ALOG(ONE/(PS*PS)))
  749.       GAUINV=YI+((((YI*P4+P3)*YI+P2)*YI+P1)*YI+P0)
  750.      1         /((((YI*Q4+Q3)*YI+Q2)*YI+Q1)*YI+Q0)
  751.       IF (P.LT.HALF) GAUINV=-GAUINV
  752.       RETURN
  753.       END
  754. C
  755.       SUBROUTINE GOF(IIN,IOUT)
  756. C
  757. C        TEST OF INDEPENDENCE AND HOMOGENEITY OF VARIANCE
  758. C        FOR TWO-DIMENSIONAL CONTINGENCY TABLES
  759. C
  760. C        LIMITATIONS:  NO MORE THAN FIVE ROWS OR COLUMNS.
  761. C
  762.       INTEGER ITABLE(5,10), IR(5), IC(10)
  763.       CHARACTER*1 QUERY
  764.       DATA NROW /5/, NCOL /10/
  765. C
  766.    30 WRITE(IOUT,70) NROW
  767.    70 FORMAT(/2X,'Enter the number of rows [.LE.',I1,']:  ',$)
  768.       READ(IIN,*,ERR=30) LROW
  769.    75 WRITE(IOUT,80) NCOL
  770.    80 FORMAT(2X,'Enter the number of columns [.LE.',I2,']:  ',$)
  771.       READ(IIN,*,ERR=75)LCOL
  772.       IF(LROW.LE.NROW.AND.LCOL.LE.NCOL)GO TO 100
  773.       WRITE(IOUT,90)
  774.    90 FORMAT(2X,'*** Permissible table dimensions exceeded')
  775.       GO TO 30
  776. C
  777.   100 WRITE (IOUT,110)
  778.   110 FORMAT(' ')
  779.       DO 130 I = 1, LROW
  780.   125 WRITE(IOUT,120) I
  781.   120 FORMAT(2X,'Enter row #',I1,':  ',$)
  782.       READ(IIN,*,ERR=125)(ITABLE(I,J), J = 1, LCOL)
  783.   130 CONTINUE
  784.  
  785.       DO 140 J = 1, LCOL
  786.       IC(J) = 0
  787.       DO 140 I = 1, LROW
  788.       IC(J) = IC(J) + ITABLE(I,J)
  789.   140 CONTINUE
  790. C
  791. C        COMPUTE ROW SUMS AND GRAND TOTAL
  792. C
  793.       GRAND = 0.0
  794.       DO 160 I = 1, LROW
  795.       IR(I) = 0
  796.       DO 150 J = 1, LCOL
  797.       IR(I) = IR(I) + ITABLE(I,J)
  798.   150 CONTINUE
  799.       GRAND = GRAND + FLOAT(IR(I))
  800.   160 CONTINUE
  801. C
  802. C        COMPUTE CHI-SQUARE P-VALUES
  803. C
  804.   180 CHISQ = 0.0
  805.       DO 190 I = 1, LROW
  806.       DO 190 J = 1, LCOL
  807.       EXPECT = FLOAT(IR(I)) * FLOAT(IC(J)) / GRAND
  808.       CHISQ = CHISQ + (FLOAT(ITABLE(I,J)) - EXPECT)**2 / EXPECT
  809.   190 CONTINUE
  810.       NDF = (LROW - 1) * (LCOL - 1)
  811.       PCHI = CHIDFC(CHISQ,NDF)
  812.       WRITE(IOUT,200) CHISQ,NDF,PCHI
  813.   200 FORMAT(/'  Pearson chi-square equals ',G11.4,' with',I3,
  814.      *   ' d.f.  (P-value = ',F7.5,')')
  815. C
  816.       IF (LROW.GT.2 .OR. LCOL.GT.2) GOTO 290
  817. C
  818. C        YATES'S CONTINUITY CORRECTED CHI-SQUARE STATISTIC
  819. C
  820.       YCHISQ = 0.0
  821.       DO 201 I = 1, 2
  822.       DO 201 J = 1, 2
  823.       EXPECT = FLOAT(IR(I)) * FLOAT(IC(J)) / GRAND
  824.       YCHISQ = YCHISQ + (ABS(FLOAT(ITABLE(I,J)) - EXPECT) - 0.5)**2 
  825.      *   / EXPECT
  826.   201 CONTINUE
  827.       YPCHI = CHIDFC(YCHISQ,1)
  828.       WRITE(IOUT,202) YCHISQ,YPCHI
  829.   202 FORMAT ('  Yates''s corrected chi-square equals ',G11.4,
  830.      *   '     (P-value = ',F7.5,')')
  831.  
  832.   290 WRITE(IOUT,300)
  833.   300 FORMAT(/2X,'Entering another table?  (Y or N):  '$)
  834.       READ(IIN,310) QUERY
  835.   310 FORMAT (A1)
  836.       IF (QUERY.EQ.'Y' .OR. QUERY.EQ.'y') GOTO 30
  837.       RETURN
  838.       END
  839. C
  840.       SUBROUTINE MCNEMR(IIN,IOUT)
  841. C
  842. C        MCNEMAR'S TEST 
  843. C        EXACT--USES BINOMIAL(n,0.5) DISTRIBUTION
  844. C
  845.    90 WRITE(IOUT,100)
  846.   100 FORMAT (/' Enter two discordant cells:  '$)
  847.       READ(IIN,*,ERR=90) B, C
  848. C
  849.       XNOBS = B + C
  850.       XNOBS1 = XNOBS + 1.0
  851.       NSTAT = MIN1(B,C)
  852.       PVAL = 0.0
  853.       DO 70 I = 0, NSTAT
  854.       TERM = ALGAMA(XNOBS1) - ALGAMA(FLOAT(I+1)) - 
  855.      *   ALGAMA(XNOBS1-FLOAT(I)) - XNOBS * ALOG(2.0)
  856.       IF (TERM.GT.-78.0) PVAL = PVAL + EXP(TERM)
  857.    70 CONTINUE
  858.       PVAL = AMIN1(1.0, 2.0 * PVAL)
  859. C
  860.       WRITE(IOUT,120) PVAL
  861.   120 FORMAT(/' P-value = ',F6.4)
  862.       RETURN
  863.       END
  864. C
  865.       FUNCTION PPCHI2(P,V)
  866. C
  867. C        ALGORITHM AS 91  APPL. STATIST. (1975) VOL.24, NO.3
  868. C
  869. C        TO EVALUATE THE PECENTAGE POINTS OF THE CHI-SQUARED
  870. C        PROBABILITY DISTRIBUTION FUNCTION.
  871. C        P MUST LIE IN THE RANGE 0.000002 TO 0.999998, V MUST BE POSITIVE,
  872. C        G MUST BE SUPPLIED AND SHOULD BE EQUAL TO LN(GAMMA(V/2.0))
  873. C
  874. C        [FAULT INDICATOR REMOVED BY G.E.D.  
  875. C        CALCULATION OF G ADDED BY G.E.D.
  876. C
  877.       DATA E, AA /0.5E-6, 0.6931471805/
  878. C
  879. C        AFTER DEFINING THE ACCURACY AND LN(2), TEST ARGUMENTS AND INITIALIZE
  880. C
  881.       PPCHI2 = -1.0
  882.       IF (P .LT. 0.000002 .OR. P .GT. 0.999998) STOP 31
  883.       IF (V .LE. 0.0) STOP 32
  884.       G = ALGAMA(V / 2.0)
  885.       XX = 0.5 * V
  886.       C = XX - 1.0
  887. C
  888. C        STARTING APPROXIMATION FOR SMALL CHI-SQUARED
  889. C
  890.       IF (V .GE. -1.24 * ALOG(P)) GOTO 1
  891.       CH = (P * XX * EXP(G + XX * AA)) ** (1.0 / XX)
  892.       IF (CH - E) 6, 4, 4
  893. C
  894. C        STARTING APPROXIMATION FOR V LESS THAN OR EQUAL TO 0.32
  895. C
  896.     1 IF (V .GT. 0.32) GOTO 3
  897.       CH = 0.4
  898.       A = ALOG(1.0 - P)
  899.     2 Q = CH
  900.       P1 = 1.0 + CH * (4.67 + CH)
  901.       P2 = CH * (6.73 + CH * (6.66 + CH))
  902.       T = -0.5 + (4.67 + 2.0 * CH) / P1 -
  903.      *   (6.73 + CH * (13.32 + 3.0 * CH)) / P2
  904.       CH = CH - (1.0 - EXP(A + G + 0.5 * CH + C * AA) * P2 / P1) / T
  905.       IF (ABS(Q / CH - 1.0) - 0.01) 4, 4, 2
  906. C
  907. C        CALL TO ALGORITHM AS 70 - NOTE THAT P HAS BEEN TESTED ABOVE
  908. C
  909.     3 X = GAUINV(P,IF1)
  910. C
  911. C        STARTING APPROXIMATION USING WILSON AND HILFERTY ESTIMATE
  912. C
  913.       P1 = 0.222222 / V
  914.       CH = V * (X * SQRT(P1) + 1.0 - P1) ** 3
  915. C
  916. C        STARTING APPROXIMATION FOR P TENDING TO 1
  917. C
  918.       IF (CH .GT. 2.2 * V + 6.0)
  919.      *   CH = -2.0 * (ALOG(1.0 - P) - C * ALOG(0.5 * CH) + G)
  920. C
  921. C        CALL TO ALGORITHM AS 32 AND CALCULATION OF SEVEN TERM
  922. C        TAYLOR SERIES
  923. C
  924.     4 Q = CH
  925.       P1 = 0.5 * CH
  926.       P2 = P - GAMAIN(P1, XX)
  927.       T = P2 * EXP(XX * AA + G + P1 - C * ALOG(CH))
  928.       B = T / CH
  929.       A = 0.5 * T - B * C
  930.       S1 = (210.0+A*(140.0+A*(105.0+A*(84.0+A*(70.0+60.0*A))))) / 420.0
  931.       S2 = (420.0+A*(735.0+A*(966.0+A*(1141.0+1278.0*A)))) / 2520.0
  932.       S3 = (210.0 + A * (426.0 + A * (707.0 + 932.0 * A))) / 2520.0
  933.       S4 =(252.0+A*(672.0+1182.0*A)+C*(294.0+A*(889.0+1740.0*A)))/5040.0
  934.       S5 = (84.0 + 264.0 * A + C * (175.0 + 606.0 * A)) / 2520.0
  935.       S6 = (120.0 + C * (346.0 + 127.0 * C)) / 5040.0
  936.       CH = CH+T*(1.0+0.5*T*S1-B*C*(S1-B*(S2-B*(S3-B*(S4-B*(S5-B*S6))))))
  937.       IF (ABS(Q / CH - 1.0) .GT. E) GOTO 4
  938. C
  939.     6 PPCHI2 = CH
  940.       RETURN
  941.       END
  942. C
  943.       SUBROUTINE PROB(IIN, IOUT)
  944. C
  945. C        PROBABILITY CALCULATION
  946. C
  947.       CHARACTER*2 QUERY
  948.       DATA MAXDIST /10/, KNORM /1/, KT /3/, KCHISQ /5/, KF /7/
  949. C
  950.       QUERY = ' '
  951.    10 WRITE(IOUT,20) 
  952.    20 FORMAT (/' Enter ''R'' to return to main menu,',
  953.      *   '  press  <ENTER>  to continue:  '$)
  954.    30 READ (IIN,40) QUERY
  955.    40 FORMAT (A2)
  956.       CALL UPCASE(QUERY)
  957.       IF (QUERY.EQ.'R ') RETURN
  958.       IF (QUERY.EQ.'Q ') STOP ' '
  959.       IF (QUERY.EQ.'  ') GOTO 50
  960.       CALL DFOPT(QUERY,NDIST)
  961.       IF (NPICK.GT.MAXDIST) GOTO 10
  962.       GOTO (100,100,200,200,300,300,400,400,500,600), NDIST
  963. C
  964.    50 WRITE (IOUT,60)
  965.    60 FORMAT (/' Your options are:'//
  966.      *   '       NQ -- standard normal:  quantile to probability'/
  967.      *   '       NP -- standard normal:  probability to quantile'/
  968.      *   '       TQ -- Student''s t:  quantile to probability'/
  969.      *   '       TP -- Student''s t:  probability to quantile'/
  970.      *   '       CQ -- chi-square:  quantile to probability'/
  971.      *   '       CP -- chi-square:  probability to quantile'/
  972.      *   '       FQ -- F:  quantile to probability'/
  973.      *   '       FP -- F:  probability to quantile'/
  974.      *   '       BI -- binomial'/
  975.      *   '       P  -- Poisson'//
  976.      *   ' Your choice?:  '$)
  977.       GOTO 30
  978. C
  979.   100 CALL N01(IIN,IOUT,NDIST-KNORM)
  980.       GOTO 10
  981. C
  982.   200 CALL STUDNT(IIN,IOUT,NDIST-KT)
  983.       GOTO 10
  984. C
  985.   300 CALL X2DFC0(IIN,IOUT,NDIST-KCHISQ)
  986.       GOTO 10
  987. C
  988.   400 CALL FDFC0(IIN,IOUT,NDIST-KF)
  989.       GOTO 10
  990. C
  991.   500 CALL BINOM(IIN,IOUT)
  992.       GOTO 10
  993. C
  994.   600 CALL POISN(IIN,IOUT)
  995.       GOTO 10
  996.       END
  997. C
  998.       SUBROUTINE DFOPT(TEXT,NO)
  999. C
  1000.       CHARACTER*2 TEXT, LIST(10)
  1001.       DATA NOPT /10/
  1002. C      
  1003.       DATA LIST(1), LIST(2), LIST(3), LIST(4), LIST(5)
  1004.      *   /    'NQ',    'NP',    'TQ',    'TP',    'CQ'/
  1005.       DATA LIST(6), LIST(7), LIST(8), LIST(9), LIST(10)
  1006.      *  /     'CP',    'FQ ',   'FP',    'BI',     'P '/
  1007. C
  1008.       DO 100 I = 1, NOPT
  1009.       NO = I
  1010.       IF (TEXT.EQ.LIST(I)) RETURN
  1011.   100 CONTINUE
  1012.       NO = NO + 1
  1013.       RETURN
  1014.       END
  1015. C
  1016.       SUBROUTINE TTEST1(IIN,IOUT)
  1017. C
  1018. C        ONE SAMPLE T TEST FROM SUMMARY STATISTICS
  1019. C
  1020.       CHARACTER*1 QUERY
  1021. C
  1022.    10 WRITE (IOUT,20)
  1023.    20 FORMAT(/' Does the summary include a standard deviation (D) or '/
  1024.      *        '                              a standard error (E)?:  '$)
  1025.       READ (IIN,30) QUERY
  1026.    30 FORMAT(A1)
  1027.       IF (QUERY.NE.'D' .AND. QUERY.NE.'d' .AND. 
  1028.      *   QUERY.NE.'E' .AND. QUERY.NE.'e') GO TO 10
  1029. C
  1030.       IF (QUERY.EQ.'E' .OR. QUERY.EQ.'e') GOTO 140
  1031. C
  1032. C        STANDARD DEVIATION
  1033. C
  1034.    40 WRITE (IOUT,50)
  1035.    50 FORMAT (/' Enter the mean, standard deviation, and sample size:')
  1036.       READ (IIN,*,ERR=40) XBAR, SD, FN
  1037.       SE = SD / SQRT(FN)
  1038.       GOTO 200
  1039. C
  1040. C        STANDARD ERROR
  1041. C
  1042.   140 WRITE (IOUT,150)
  1043.   150 FORMAT (/' Enter the mean, standard error, and sample size:')
  1044.       READ (IIN,*,ERR=140) XBAR, SE, FN
  1045. C
  1046.   200 T = XBAR / SE
  1047. C
  1048.       NDF = FN - 1.0
  1049. C
  1050.       P = FDFC(T**2,1.0,FLOAT(NDF))
  1051. C
  1052.       WRITE (IOUT,210) T, NDF, P
  1053.   210 FORMAT (
  1054.      *   /'   t = ',G11.4,5X,'(',I4,' d.f.)',5X,'P-value = ',F6.4)
  1055.       RETURN
  1056.       END
  1057. C
  1058.       SUBROUTINE TTEST2(IIN,IOUT)
  1059. C
  1060. C        T TEST FOR INDEPENDENT SAMPLES FROM SUMMARY STATISTICS
  1061. C
  1062.       CHARACTER*1 QUERY
  1063. C
  1064.    10 WRITE (IOUT,20)
  1065.    20 FORMAT(/' Do the summaries include standard deviations (D) or '/
  1066.      *        '                              standard errors (E)?:  '$)
  1067.       READ (IIN,30) QUERY
  1068.    30 FORMAT(A1)
  1069.       IF (QUERY.NE.'D' .AND. QUERY.NE.'d' .AND. 
  1070.      *   QUERY.NE.'E' .AND. QUERY.NE.'e') GO TO 10
  1071. C
  1072.       IF (QUERY.EQ.'E' .OR. QUERY.EQ.'e') GOTO 140
  1073. C
  1074. C        STANDARD DEVIATIONS
  1075. C
  1076.    40 WRITE (IOUT,50)
  1077.    50 FORMAT (/' Enter the mean, standard deviation, and sample size',
  1078.      *   ' for sample 1:')
  1079.       READ (IIN,*,ERR=40) XBAR1, SD1, FN1
  1080.       SE1 = SD1 / SQRT(FN1)
  1081.    60 WRITE (IOUT,70)
  1082.    70 FORMAT (' Enter the mean, standard deviation, and sample size',
  1083.      *   ' for sample 2:')
  1084.       READ (IIN,*,ERR=60) XBAR2, SD2, FN2
  1085.       SE2 = SD2 / SQRT(FN2)
  1086.       GOTO 200
  1087. C
  1088. C        STANDARD ERRORS
  1089. C
  1090.   140 WRITE (IOUT,150)
  1091.   150 FORMAT (/' Enter the mean, standard error, and sample size',
  1092.      *   ' for sample 1:')
  1093.       READ (IIN,*,ERR=140) XBAR1, SE1, FN1
  1094.       SD1 = SE1 * SQRT(FN1)
  1095.   160 WRITE (IOUT,170)
  1096.   170 FORMAT (' Enter the mean, standard error, and sample size',
  1097.      *   ' for sample 2:')
  1098.       READ (IIN,*,ERR=160) XBAR2, SE2, FN2
  1099.       SD2 = SE2 * SQRT(FN2)
  1100. C
  1101. C        EQUAL VARIANCES
  1102. C
  1103.   200 XBARD = XBAR1 - XBAR2
  1104.       IFN1 = FN1
  1105.       IFN2 = FN2
  1106.       SDP = SQRT((((FN1 - 1.0) * SD1 * SD1 + (FN2 - 1.0) * SD2 * SD2)
  1107.      *   / (FN1 + FN2 - 2.0)))
  1108.       SEDEQ = SDP * SQRT(1.0 / FN1 + 1.0 / FN2)
  1109.       TEQ = XBARD / SEDEQ
  1110.       NDFEQ = FN1 + FN2 - 2.0
  1111.       PEQ = FDFC(TEQ**2,1.0,FLOAT(NDFEQ))
  1112. C
  1113.        WRITE(IOUT,210) XBAR1, XBAR2, XBARD, SD1, SD2, IFN1, IFN2
  1114.   210 FORMAT (/24X,'sample 1      sample 2     difference'/
  1115.      *   17X,'mean',3G14.5/
  1116.      *   3X,'standard deviation',2G14.5/
  1117.      *   10X,'sample size',I10,I14)
  1118. C
  1119. C        UNEQUAL VARIANCES
  1120. C
  1121.       IF (FN1.LE.1.0 .OR. FN2.LE.1.0 .OR. SD1.EQ.0.0 .OR. SD2.EQ.0.0) 
  1122.      *   GOTO 225
  1123.       SEDNEQ = SQRT(SE1 * SE1 + SE2 * SE2)
  1124.       TNEQ = XBARD / SEDNEQ
  1125.       C = SE1**2 / (SE1**2 + SE2**2)
  1126.       DFNEQ = 1.0 / ( C**2 / (FN1 - 1.0) + (1.0 - C)**2 / (FN2 - 1.0))
  1127.       PNEQ = FDFC(TNEQ**2, 1.0, DFNEQ)
  1128.       FRAT = SD1**2 / SD2**2
  1129.       NDFN = FN1 - 1.0
  1130.       NDFD = FN2 - 1.0
  1131.       IF (FRAT.GE.1.0) GOTO 219
  1132.       NDFD = FN1 - 1.0
  1133.       NDFN = FN2 - 1.0
  1134.       FRAT = 1.0 / FRAT
  1135.   219 PF =  2.0 * FDFC(FRAT,FLOAT(NDFN),FLOAT(NDFD))
  1136.       WRITE (IOUT,220) SDP, FRAT, NDFN, NDFD, PF
  1137.   220 FORMAT (/'      Pooled standard deviation:  ',G12.5//
  1138.      *   ' F-test for equality of variances:  F-ratio:  ',F7.2/
  1139.      *   '                             numerator d.f.:',I9/
  1140.      *   '                           denominator d.f.:',I9/
  1141.      *   '                                    P-value:  ',F7.4/)
  1142. C
  1143.   225 WRITE (IOUT,230) TEQ, NDFEQ, PEQ
  1144.   230 FORMAT (
  1145.      *   /'   Equal variances:  t = ',G11.4,5X,'(',I4,'   d.f.)',5X,
  1146.      *   'P-value = ',F6.4)
  1147.       IF (FN1.GT.1.0 .AND. FN2.GT.1.0 .AND. SD1.GT.0.0 .AND. 
  1148.      *   SD2.GT.0.0)  WRITE (IOUT,240) TNEQ, DFNEQ, PNEQ
  1149.   240 FORMAT (
  1150.      *    ' Unequal variances:  t = ',G11.4,5X,'(',F6.1,' d.f.)',5X,
  1151.      *   'P-value = ',F6.4)
  1152. C
  1153.       CIU = XINBTA(FLOAT(NDFEQ)/2.0, 0.5, 0.05)
  1154.       CIU = SQRT(FLOAT(NDFEQ)*(1.0/ CIU - 1.0))
  1155.       CIL = XBARD - CIU * SEDEQ
  1156.       CIU = XBARD + CIU * SEDEQ
  1157.       WRITE(IOUT,350) SEDEQ, CIL, CIU
  1158.   350 FORMAT (/'   Equal variances:  standard error of difference:  ',
  1159.      *   G12.5/
  1160.      *   21X,'95% C.I. for mean difference:  (',G12.5,' ,',G12.5')')
  1161.       IF (FN1.LE.1.0 .OR. FN2.LE.1.0 .OR. SD1.EQ.0.0 .OR. SD2.EQ.0.0) 
  1162.      *   RETURN
  1163. C
  1164.       CIU = XINBTA(DFNEQ/2.0, 0.5, 0.05)
  1165.       CIU = SQRT(DFNEQ*(1.0/ CIU - 1.0))
  1166.       CIL = XBARD - CIU * SEDNEQ
  1167.       CIU = XBARD + CIU * SEDNEQ
  1168.       WRITE(IOUT,360) SEDNEQ, CIL, CIU
  1169.   360 FORMAT (/' Unequal variances:  standard error of difference:  ',
  1170.      *   G12.5/
  1171.      *   21X,'95% C.I. for mean difference:  (',G12.5,' ,',G12.5')'/)
  1172. C
  1173.       RETURN
  1174.       END
  1175. C
  1176.       SUBROUTINE X2DFC0(IIN, IOUT, NPICK)
  1177. C
  1178. C        CHI-SQUARE DISTRIBUTION
  1179. C
  1180.       IF(NPICK.EQ.1) GOTO 200
  1181. C
  1182.    30 WRITE (IOUT,40)
  1183.    40 FORMAT(/' Enter chi-square quantile:  '$)
  1184.       READ (IIN,*,ERR=30) CHISQ
  1185. C
  1186.   110 WRITE (IOUT,120)
  1187.   120 FORMAT(' Enter degrees of freedom:  '$)
  1188.       READ (IIN,*,ERR=110) DF
  1189.       IF (DF.NE.FLOAT(IFIX(DF))) GOTO 110
  1190.       NDF = DF
  1191.       PVAL = CHIDFC(CHISQ,NDF)
  1192.       WRITE (IOUT,150) PVAL
  1193.   150 FORMAT (' Upper tail probability =',F8.5)
  1194.       RETURN
  1195. C
  1196.   200 WRITE (IOUT,210)
  1197.   210 FORMAT(/' Enter upper tail probability:  '$)
  1198.       READ(IIN,*,ERR=200) PVAL
  1199.       IF(PVAL.LT.0.0 .OR. PVAL.GT.1.0) GOTO 200
  1200.   220 WRITE (IOUT,230)
  1201.   230 FORMAT(' Enter degrees of freedom:  '$)
  1202.       READ (IIN,*,ERR=220) DF
  1203.       WRITE(IOUT,250) PPCHI2(1.0 - PVAL,DF)
  1204.   250 FORMAT (' Upper tail percentile = ',G12.5)
  1205.       RETURN
  1206.       END
  1207. C
  1208.       SUBROUTINE STUDNT(IIN, IOUT, NPICK)
  1209. C
  1210. C        INFORMATION FOR STUDENT'S T-DISTRIBUTION
  1211. C
  1212.       IF(NPICK.EQ.0) GOTO 230
  1213. C
  1214.    10 WRITE (IOUT,20)
  1215.    20 FORMAT(/' Enter upper tail probability:  '$)
  1216.       READ(IIN,*,ERR=10) PVAL
  1217.       IF(PVAL.LE.0.0 .OR. PVAL.GE.1.0) GOTO 10
  1218.    30 WRITE (IOUT,40)
  1219.    40 FORMAT(' Enter degrees of freedom:  '$)
  1220.       READ (IIN,*,ERR=30) DF
  1221.       T = XINBTA(DF/2.0, 0.5, 2.0 * AMIN1(PVAL,1.0-PVAL))
  1222.       T = SQRT(DF*(1.0/ T - 1.0))
  1223.       IF (PVAL.GT.0.5) T = -T
  1224.       WRITE(IOUT,50) T
  1225.    50 FORMAT (' Upper tail percentile: ',F8.3)
  1226.       RETURN
  1227. C
  1228.   230 WRITE (IOUT,240)
  1229.   240 FORMAT(/' Enter t quantile:  '$)
  1230.       READ (IIN,*,ERR=230) T
  1231.   250 WRITE (IOUT,260)
  1232.   260 FORMAT(' Enter degrees of freedom:  '$)
  1233.       READ (IIN,*,ERR=250) DF
  1234.       IF (DF.NE.FLOAT(IFIX(DF))) GOTO 250
  1235.       NDF = DF
  1236.       PVAL = 0.5 * FDFC(T**2,1.0,DF)
  1237.       IF (T.GT.0) PVAL = 1.0 - PVAL
  1238. C
  1239.       WRITE(IOUT,270) 1.0 - PVAL, PVAL, 
  1240.      *   2.0 * AMIN1(1.0 - PVAL, PVAL)
  1241.   270 FORMAT(/25X,'Upper tail = ',F7.4,
  1242.      *       /25X,'Lower tail = ',F7.4,
  1243.      *       /25X,'Two-tailed = ',F7.4)
  1244.       RETURN
  1245.       END
  1246. C
  1247.       SUBROUTINE N01(IIN, IOUT, NPICK)
  1248. C
  1249. C        INFORMATION FOR STANDARD NORMAL DISTRIBUTION
  1250. C
  1251.       IF(NPICK.EQ.1) GOTO 200
  1252. C
  1253.   130 WRITE (IOUT,140)
  1254.   140 FORMAT(/' Enter quantile:  '$)
  1255.       READ (IIN,*,ERR=130) Z
  1256.       ZC = Z      
  1257.       IF (Z.NE.0.0) GOTO 160
  1258.   150 WRITE (IOUT,155)
  1259.   155 FORMAT (' Enter A,B,C.  STAT-SAK will use A / (B / SQRT(C)):')
  1260.       READ (IIN,*,ERR=150) A,B,C
  1261.       Z = A / (B / SQRT(C))
  1262.   160 PVAL = ALNORM(Z,.TRUE.)
  1263. C
  1264.       IF (ZC.EQ.0.0) WRITE (IOUT,165) Z
  1265.   165 FORMAT(
  1266.      *       /25X,'         z = ',F7.3)
  1267.       WRITE(IOUT,170) PVAL, 1.0 - PVAL, 
  1268.      *   2.0 * AMIN1(1.0 - PVAL, PVAL)
  1269.   170 FORMAT(/25X,'Upper tail = ',F7.4,
  1270.      *       /25X,'Lower tail = ',F7.4,
  1271.      *       /25X,'Two-tailed = ',F7.4)
  1272.       RETURN
  1273. C
  1274.   200 WRITE (IOUT,210)
  1275.   210 FORMAT(/' Enter upper tail probability:  '$)
  1276.       READ(IIN,*,ERR=200) PVAL
  1277.       IF(PVAL.LT.0.0 .OR. PVAL.GT.1.0) GOTO 200
  1278.       WRITE(IOUT,250) ABS(GAUINV(PVAL,IFAULT))
  1279.   250 FORMAT (/' Quantile = ',G12.5)
  1280.       RETURN
  1281.       END
  1282. C
  1283.        SUBROUTINE OMEANS(IIN,IOUT)
  1284. C
  1285. C              BARTHOLOMEW'S TEST FOR ORDERED SAMPLES (INCREASING)
  1286. C
  1287.       DIMENSION XBAR(10), SD(10), SE(10), FN(10), DF(10)
  1288.       LOGICAL QSD
  1289.       CHARACTER*1 QUERY
  1290.       CHARACTER FNAME*50
  1291.       DATA IFIN /10/
  1292. C
  1293.     3 WRITE(IOUT,4)
  1294.     4 FORMAT(/' Enter the number of samples [.LE.10]:  ',$)
  1295.       READ(IIN,*,ERR=3) NSAM
  1296.       IF(NSAM.LT.2 .OR. NSAM.GT.10) GOTO 3
  1297.       TDF = NSAM - 1
  1298. C
  1299.     8 WRITE (IOUT,9)
  1300.     9 FORMAT(' Do you wish to enter standard errors (E) or ',
  1301.      *       'standard deviations (D)?:  '$)
  1302.       READ (IIN,10) QUERY
  1303.    10 FORMAT(A1)
  1304.       IF (QUERY.NE.'D' .AND. QUERY.NE.'d' .AND. 
  1305.      *   QUERY.NE.'E' .AND. QUERY.NE.'e') GO TO 8
  1306.       QSD = .TRUE.
  1307.       IF (QUERY.EQ.'E' .OR. QUERY.EQ.'e') QSD = .FALSE.
  1308. C
  1309.       WRITE (IOUT,900)
  1310.   900 FORMAT(' Are data contained in an external file?  (Y or N):  '$)
  1311.       READ (IIN,10) QUERY
  1312.       IF (QUERY.NE.'Y' .AND. QUERY.NE.'y') GOTO 999
  1313.   905 WRITE (IOUT,910)
  1314.   910 FORMAT (' Enter filename:  '$)
  1315.       READ (IIN,'(A)') FNAME
  1316.       OPEN (IFIN, FILE = FNAME, STATUS = 'OLD', IOSTAT =IOCHK)
  1317.       IF (IOCHK.NE.0) GOTO 905
  1318.       IF (QSD) GOTO 950
  1319. C
  1320.       WRITE (IOUT,920)
  1321.   920 FORMAT (/'    Mean      S.E.        count'/)
  1322.       DO 940 I = 1, NSAM
  1323.       READ (IFIN,*) XBAR(I), SE(I), FN(I)
  1324.       WRITE (IOUT,930) XBAR(I), SE(I), FN(I)
  1325.       SD(I) = SE(I) * SQRT(FN(I))
  1326.   930 FORMAT (1X,2G11.4,F8.0)
  1327.   940 CONTINUE
  1328.       CLOSE (IFIN)
  1329.       GOTO 26
  1330. C
  1331.   950 WRITE (IOUT,960)
  1332.   960 FORMAT (/'    Mean      S.D.        count'/)
  1333.       DO 970 I = 1, NSAM
  1334.       READ (IFIN,*) XBAR(I), SD(I), FN(I)
  1335.       WRITE (IOUT,930) XBAR(I), SD(I), FN(I)
  1336.       SE(I) = SD(I) / SQRT(FN(I))
  1337.   970 CONTINUE
  1338.       CLOSE (IFIN)
  1339.       GOTO 26      
  1340. C
  1341. C
  1342.   999 IF (QSD) GOTO 16
  1343.       DO 14 I = 1, NSAM
  1344.    11 WRITE (IOUT,12) I
  1345.    12 FORMAT(' Enter mean, standard error, and sample size for sample',
  1346.      *   I3,':')
  1347.       READ(IIN,*,ERR=11) XBAR(I), SE(I), FN(I)
  1348.       SD(I) = SE(I) * SQRT(FN(I))
  1349.    14 CONTINUE
  1350.       GOTO 26
  1351. C
  1352.    16 DO 25 I = 1, NSAM
  1353.    18 WRITE (IOUT,19) I
  1354.    19 FORMAT(' Enter mean, standard deviation, and sample size for ',
  1355.      *'sample',I3,':')
  1356.       READ(IIN,*,ERR=18) XBAR(I), SD(I), FN(I)
  1357.       SE(I) = SD(I) / SQRT(FN(I))
  1358.    25 CONTINUE
  1359. C
  1360. C              GET BETWEEN GROUP SUM OF SQUARES
  1361. C
  1362.    26 TBAR = 0.0
  1363.       TN = 0.0
  1364.       DO 27 I = 1, NSAM
  1365.       DF(I) = 1.0
  1366.       TBAR = TBAR + XBAR(I) * FN(I)
  1367.       TN = TN + FN(I)
  1368.    27 CONTINUE
  1369.       TBAR = TBAR / TN
  1370. C
  1371.       BSS = 0.0
  1372.       WSS = 0.0
  1373.       DO 28 I = 1, NSAM
  1374.       BSS = BSS + FN(I) * (XBAR(I) - TBAR)**2
  1375.       WSS = WSS + (FN(I) - 1.0) * SD(I)**2
  1376.    28 CONTINUE
  1377. C
  1378. C              BARTHOLOMEW'S TEST
  1379. C
  1380.       DO 50 J=2,NSAM
  1381.       IF (XBAR(J-1).LE.XBAR(J)) GO TO 50
  1382. C
  1383. C              MEAN DECREASES...DETERMINE VALUE BY POOLING
  1384. C              SO THAT SEQUENCE IS MONOTONE
  1385. C
  1386.       DF(J-1) = 0.0
  1387.       PNUM = FN(J-1) * XBAR(J-1) + FN(J) * XBAR(J)
  1388.       PDEN = FN(J-1) + FN(J)
  1389.       PX=PNUM/PDEN
  1390. C
  1391. C              IS IT NECESSARY TO GO FURTHER BACK?
  1392. C
  1393.       JS=J-1
  1394.       IF (JS.EQ.1) GO TO 30
  1395.       JM2=J-2
  1396.       DO 29 I=1,JM2
  1397.       IF (XBAR(JS-1).LE.PX) GO TO 30
  1398.       JS=JS-1
  1399.       DF(JS) = 0.0
  1400.       PNUM=PNUM+XBAR(JS)*FN(JS)
  1401.       PDEN=PDEN+FN(JS)
  1402.       PX=PNUM/PDEN
  1403.    29 CONTINUE
  1404.    30 DO 40 J1=JS,J
  1405.       XBAR(J1)=PX
  1406.    40 CONTINUE
  1407.    50 CONTINUE
  1408. C
  1409. C              CALCULATE STATISTIC
  1410. C
  1411.       ODF = -1.0
  1412.       OBSS = 0.0
  1413.       DO 60 I = 1, NSAM
  1414.       ODF = ODF + DF(I)
  1415.       OBSS = OBSS + FN(I) * (XBAR(I) - TBAR)**2
  1416.    60 CONTINUE
  1417.       OWSS = BSS + WSS - OBSS
  1418. C
  1419.       FRAT = (BSS / TDF) / (WSS / (TN - TDF + 1.0))
  1420.       PF = FDFC(FRAT,TDF,TN-TDF+1.0)
  1421.       OFRAT = 0.0
  1422.       IF (ODF.GT.0.0)
  1423.      *   OFRAT = (OBSS / ODF) / (OWSS / (TN - ODF + 1.0))
  1424.       CALL PBART(OFRAT,PVAL,NSAM,TN-ODF+1.0,1,SE)
  1425. C
  1426. C        PUT BOUNDS ON THE LACK OF FIT
  1427. C
  1428.       DIFFU = ((BSS - OBSS) / TDF) / (WSS / (TN - TDF + 1.0))
  1429.       PDIFFU = FDFC(DIFFU,TDF,TN-TDF+1.0)
  1430.       DIFFL = ((BSS - OBSS) / 1.0) / (WSS / (TN - TDF + 1.0))
  1431.       PDIFFL = 0.5 * FDFC(DIFFL,1.0,TN-TDF+1.0)
  1432.       WRITE (IOUT,70) BSS,OBSS,BSS-OBSS,WSS
  1433.    70 FORMAT (/' Sums of squares:',10X,'  between groups  ',G12.5
  1434.      *       //10X,'                monotone increase  ',G12.5
  1435.      *        /10X,'lack of fit  (between - monotone)  ',G12.5
  1436.      *       //10X,'                     within group  ',G12.5)
  1437. C
  1438.       WRITE (IOUT,72) FRAT, PF
  1439.    72 FORMAT(/' Overall F-ratio =',F8.2,5X,'P-value =',F6.3)
  1440.       WRITE (IOUT,80) OFRAT
  1441.    80 FORMAT(/'         F-ratio for order restriction = ',F8.2)
  1442.       IF (NSAM.EQ.3 .OR.NSAM.EQ.4) WRITE(IOUT,90) PVAL
  1443.    90 FORMAT ('                       P-value (exact) = ',F8.3)
  1444.       IF (NSAM.NE.3 .AND.NSAM.NE.4) WRITE(IOUT,100) PVAL
  1445.   100 FORMAT (' P-value (assuming equal weights) = ',F8.3)
  1446.       WRITE(IOUT,110) PDIFFL, PDIFFU
  1447.   110 FORMAT(/'     Lack of fit :  ',F6.3,' <= P-value <=',F6.3)
  1448. C
  1449.       RETURN
  1450.       END
  1451. C
  1452.       SUBROUTINE PBART(STAT,PVAL,IK,DFD,IFC,WT)
  1453. C
  1454. C        P-VALUE FOR BARTHOLOMEW'S TEST IN THE CASE OF EQUAL 
  1455. C        SAMPLE SIZES (ARBITRARY FOR IK = 3,4)
  1456. C
  1457. C        IK -- NUMBER OF GROUPS
  1458. C        DFD -- DENOMINATOR DF FOR F; DUMMY FOR CHI SQUARE
  1459. C        IFC = 1, F DISTRIBUTION
  1460. C              2, CHI SQUARE DISTRIBUTION
  1461. C        WT -- WEIGHTS:  COL TOTS FOR CHI SQUARE
  1462. C                        SE'S FOR F
  1463. C
  1464. C        CALLING PROGRAMS HAVE VERIFIED THAT THERE ARE FEWER 
  1465. C        THAN 10 GROUPS
  1466. C
  1467.       DIMENSION P(10,10), WT(IK)
  1468.       DATA PI /3.14159265/
  1469. C
  1470.       IF (IK.EQ.3) GOTO 150
  1471.       IF (IK.EQ.4) GOTO 180
  1472. C
  1473.       P(1,1) = 1.0
  1474.       DO 10 K = 2, IK
  1475.       P(1,K) = 1.0 / FLOAT(K)
  1476.       P(K,K) = P(K-1,K-1) * P(1,K)
  1477.    10 CONTINUE
  1478. C
  1479.       DO 20 K = 3, IK
  1480.       DO 20 L = 2, K-1
  1481.       P(L,K) = (P(L-1,K-1)+ FLOAT(K-1) * P(L,K-1)) / FLOAT(K)
  1482.    20 CONTINUE
  1483. C
  1484.       IF (IFC.EQ.2) GOTO 100
  1485. C
  1486. C        F DISTRIBUTION
  1487. C
  1488.       PVAL = 0.0
  1489.       DO 30 L = 2, IK
  1490.    30 PVAL = PVAL + P(L,IK) * FDFC(STAT,FLOAT(L-1),DFD)
  1491.       RETURN
  1492. C
  1493.   100 PVAL = 0.0
  1494.       DO 110 L = 2, IK
  1495.   110 PVAL = PVAL + P(L,IK) * CHIDFC(STAT,L-1)
  1496.       RETURN
  1497. C
  1498. C        IK = 3  (SPECIAL CASE)
  1499. C
  1500.   150 RHO12 = - SQRT(WT(1) * WT(3) / 
  1501.      *   ((WT(1) + WT(2)) * (WT(2) + WT(3))))
  1502.       IF (IFC.EQ.1) PVAL = 
  1503.      *   (1.0 - ACOS(RHO12) / PI) * FDFC(STAT,2.0,DFD)
  1504.      *   + FDFC(STAT,1.0,DFD)
  1505.       IF (IFC.EQ.2) PVAL = (1.0 - ACOS(RHO12) / PI) * CHIDFC(STAT,2)
  1506.      *   + CHIDFC(STAT,1)
  1507.       PVAL = 0.5 * PVAL
  1508.       RETURN
  1509. C
  1510. C        IK = 4  (SPECIAL CASE)
  1511. C
  1512.   180 RHO12 = - SQRT(WT(1) * WT(3) / 
  1513.      *   ((WT(1) + WT(2)) * (WT(2) + WT(3))))
  1514.       RHO23 = - SQRT(WT(2) * WT(4) / 
  1515.      *   ((WT(2) + WT(3)) * (WT(3) + WT(4))))
  1516.       RHO231 = - SQRT((WT(1) + WT(2)) * WT(4) / 
  1517.      *   ((WT(1) + WT(2) + WT(3)) * (WT(3) + WT(4))))
  1518.       RHO132 = - SQRT(WT(1) * WT(4) / 
  1519.      *   ((WT(1) + WT(2) + WT(3)) * (WT(2) + WT(3) + WT(4))))
  1520.       RHO123 = - SQRT(WT(1) * (WT(3) + WT(4)) / 
  1521.      *   ((WT(1) + WT(2)) * (WT(3) + WT(4))))
  1522. C
  1523.       P(2,4) = 0.125 + (ACOS(RHO12) + ACOS(RHO23))/ (4.0 * PI)
  1524.       P(3,4) = 0.75 - (ACOS(RHO231) + ACOS(RHO132) +ACOS(RHO123))
  1525.      *   / (4.0 * PI)
  1526.       P(4,4) = 0.50 - P(2,4)
  1527.       PVAL = 0.0
  1528.       DO 200 L = 2, 4
  1529.       IF (IFC.EQ.1)
  1530.      *   PVAL = PVAL + P(L,4) * FDFC(STAT,FLOAT(L-1),DFD)
  1531.       IF (IFC.EQ.2)
  1532.      *   PVAL = PVAL + P(L,4) * CHIDFC(STAT,L-1)  
  1533.   200 CONTINUE
  1534.       RETURN
  1535.       END
  1536. C
  1537.       SUBROUTINE BINOM(IIN,IOUT)
  1538. C
  1539. C        BINOMAL DISTRIBUTION
  1540. C
  1541.    10 WRITE(IOUT,20)
  1542.    20 FORMAT(/' Enter n, p, k:  '$)
  1543.       READ(IIN,*,ERR=10) XN,P,XK
  1544.       K = XK
  1545. C
  1546.       IF (P.LE.0.0 .OR. P.GE.1.0 .OR. FLOAT(K).NE.XK
  1547.      *   .OR. XK.GT.XN) GOTO 10
  1548. C
  1549.       PLO = 0.0
  1550.       XN1 = XN + 1.0
  1551.       DO 70 I = 0, K
  1552.       XI = I
  1553.       TERM = ALGAMA(XN1) - ALGAMA(XI+1.0) - 
  1554.      *   ALGAMA(XN1-XI) + XI * ALOG(P) + (XN-XI) * ALOG(1.0-P)
  1555.       IF (TERM.GT.-78.0) PLO = PLO + EXP(TERM)
  1556.    70 CONTINUE
  1557.       IF (TERM.GT.-78.0) TERM = EXP(TERM)
  1558.       IF (TERM.LT.0.0) TERM = 0.0
  1559.       PHI = 1.0 - PLO + TERM
  1560. C
  1561.       WRITE(IOUT,80) IFIX(XN),P,K,TERM,K,PLO,K,PHI
  1562.    80 FORMAT(/' Prob (binomial(',I3,',',F5.3,')  =',I3,')  = ',F7.4/
  1563.      *   27X,'<=',I3,')  = ',F7.4/
  1564.      *   27X,'>=',I3,')  = ',F7.4)
  1565. C
  1566.       RETURN
  1567.       END
  1568. C
  1569.       SUBROUTINE POISN(IIN,IOUT)
  1570. C
  1571. C        POISSON DISTRIBUTION
  1572. C
  1573.    10 WRITE(IOUT,20)
  1574.    20 FORMAT(/' Enter mean and quantile:  '$)
  1575.       READ(IIN,*,ERR=10) XLAM,XK
  1576.       K = XK
  1577. C
  1578.       IF (XLAM.LT.0.0 .OR. FLOAT(K).NE.XK) GOTO 10
  1579. C
  1580.       PLO = 0.0
  1581.       DO 70 I = 0, K
  1582.       XI = I
  1583.       TERM = -XLAM + XI * ALOG(XLAM) - ALGAMA(XI+1.0)
  1584.       IF (TERM.GT.-78.0) PLO = PLO + EXP(TERM)
  1585.    70 CONTINUE
  1586.       IF (TERM.GT.-78.0) TERM = EXP(TERM)
  1587.       IF (TERM.LT.0.0) TERM = 0.0
  1588.       PHI = 1.0 - PLO + TERM
  1589. C
  1590.       WRITE(IOUT,80) XLAM,K,TERM,K,PLO,K,PHI
  1591.    80 FORMAT(/' Prob (Poisson(',G10.4,')  =',I3,')  = ',F7.4/
  1592.      *   27X,'<=',I3,')  = ',F7.4/
  1593.      *   27X,'>=',I3,')  = ',F7.4)
  1594. C
  1595.       RETURN
  1596.       END
  1597. C
  1598.       SUBROUTINE FISHER(IIN,IOUT)
  1599. C
  1600. C        FISHER'S EXACT TEST FOR 2*2 CONTINGENCY TABLES
  1601. C
  1602.       HYPR(X11,RT1,RT2,CT1,XN) = ALGAMA(RT1+1.0) - ALGAMA(X11+1.0)
  1603.      *   - ALGAMA(RT1-X11+1.0) + ALGAMA(RT2+1.0) - ALGAMA(CT1-X11+1.0)
  1604.      *   - ALGAMA(RT2-CT1+X11+1.0)
  1605.   110 WRITE (IOUT,120)
  1606.   120 FORMAT(/' Enter row 1:  ',$)
  1607.       READ(IIN,*,ERR=110) TABL11, TABL12
  1608.   130 WRITE (IOUT,140)
  1609.   140 FORMAT(' Enter row 2:  ',$)
  1610.       READ(IIN,*,ERR=130) TABL21, TABL22
  1611. C
  1612. C        CALCULATE ROW AND COLUMN TOTALS
  1613. C        PERMUTE TABLE SO THAT FIRST ROW AND COLUMN 
  1614. C        HAVE SMALLER TOTALS
  1615. C
  1616.       RT1 = TABL11 + TABL12
  1617.       RT2 = TABL21 + TABL22
  1618.       IF (RT1.LE.RT2) GOTO 200
  1619.       DUM = RT1
  1620.       RT1 = RT2
  1621.       RT2 = DUM
  1622.       DUM = TABL11
  1623.       TABL11 = TABL21
  1624.       TABL21  = DUM
  1625.       DUM = TABL12
  1626.       TABL12 = TABL22
  1627.       TABL22 = DUM
  1628. C   
  1629.   200 CT1 = TABL11 + TABL21
  1630.       CT2 = TABL12 + TABL22
  1631.       IF (CT1.LE.CT2) GOTO 210
  1632.       DUM = CT1
  1633.       CT1 = CT2
  1634.       CT2 = DUM
  1635.       DUM = TABL11
  1636.       TABL11 = TABL12
  1637.       TABL12  = DUM
  1638.       DUM = TABL21
  1639.       TABL21 = TABL22
  1640.       TABL22 = DUM
  1641. C   
  1642.   210 GRAND = RT1 + RT2
  1643.       HYPR0 = ALGAMA(CT1+1.0) + ALGAMA(GRAND-CT1+1.0)
  1644.      *   - ALGAMA(GRAND+1.0)
  1645.       PVALL = 0.0
  1646.       PVALU = 0.0
  1647.       TERM = HYPR0 + HYPR(TABL11,RT1,RT2,CT1,GRAND) 
  1648.       IF (TERM.LT.-78.0) GO TO 280
  1649.       TERMO = EXP(TERM)
  1650.       IMAX = MIN1(RT1,CT1)
  1651.       I11 = TABL11
  1652. C
  1653.       PVALL = 0.0
  1654.       IENDL = -1
  1655.       DO 250 I = 0, I11
  1656.       TERM = HYPR0 + HYPR(FLOAT(I),RT1,RT2,CT1,GRAND) 
  1657.       IF (TERM.LT.-78.0) GOTO 250
  1658.       TERM = EXP(TERM)
  1659.       IF (TERM.GT.TERMO) GOTO 260
  1660.       IENDL = I
  1661.       PVALL = PVALL + TERM
  1662.   250 CONTINUE
  1663.       PVAL1 = PVALL
  1664. C
  1665.   260 PVALU = 0.0
  1666.       IENDU = -2
  1667.       DO 270 I = IMAX, I11, -1
  1668.       TERM = HYPR0 + HYPR(FLOAT(I),RT1,RT2,CT1,GRAND) 
  1669.       IF (TERM.LT.-78.0) GOTO 270
  1670.       TERM = EXP(TERM)
  1671.       IF (TERM.GT.TERMO) GOTO 280
  1672.       IENDU = I
  1673.       PVALU = PVALU + TERM
  1674.   270 CONTINUE
  1675.       PVAL1 = PVALU
  1676. C
  1677.   280 PVAL2 = PVALL + PVALU
  1678.       IF (IENDL.NE.IENDU) GOTO 290
  1679.       PVAL1 = AMIN1(PVALL, PVALU)
  1680.       PVAL2 = 1.0
  1681.   290 WRITE(IOUT,300) PVAL1, PVAL2
  1682.   300 FORMAT(/' Fisher''s exact test:   1 tailed  ',F7.4/
  1683.      *         '                        2 tailed  ',F7.4)
  1684. C
  1685.       RETURN
  1686.       END
  1687. C
  1688.       FUNCTION XINBTA(P, Q, ALPHA)
  1689. C
  1690. C        ALGORITHM AS 109 APPL.STATIST. (1977), VOL.26, NO.1
  1691. C        (REPLACING ALGORITHM AS 64  APPL. STATIST. (1973),
  1692. C        VOL.22, NO.3)
  1693. C        ***[FAULT INDICATOR REMOVED BY G.E.D.]***
  1694. C
  1695. C        COMPUTES INVERSE OF INCOMPLETE BETA FUNCTION
  1696. C        RATIO FOR GIVEN POSITIVE VALUES OF THE ARGUMENTS
  1697. C        P AND Q, ALPHA BETWEEN ZERO AND ONE.
  1698. C        LOG OF COMPLETE BETA FUNCTION, BETA, IS ASSUMED TO BE KNOWN.
  1699. C        ***[CALCULATION OF BETA ADDED BY G.E.D]***
  1700. C
  1701.       LOGICAL INDEX
  1702. C
  1703. C        DEFINE ACCURACY AND INITIALIZE
  1704. C
  1705.       DATA ACU /1.0E-14/
  1706.       XINBTA = ALPHA
  1707. C
  1708. C        TEST FOR ADMISIBILITY OF PARAMETERS
  1709. C
  1710.       IF (P.LE.0.0.OR.Q.LE.0.0) STOP 50
  1711.       IF (ALPHA.LT.0.0.OR.ALPHA.GT.1.0) STOP 51
  1712.       IF (ALPHA.EQ.0.0.OR.ALPHA.EQ.1.0) RETURN
  1713. C
  1714.       BETA=ALGAMA(P)+ALGAMA(Q)-ALGAMA(P+Q)
  1715. C
  1716. C        CHANGE TAIL IF NECESSARY
  1717. C
  1718.       IF (ALPHA .LE. 0.5) GOTO 1
  1719.       A = 1.0 - ALPHA
  1720.       PP = Q
  1721.       QQ = P
  1722.       INDEX = .TRUE.
  1723.       GOTO 2
  1724.     1 A = ALPHA
  1725.       PP = P 
  1726.       QQ = Q
  1727.       INDEX = .FALSE.
  1728. C
  1729. C        CALCULATE INITIAL APPROXIMATION
  1730. C
  1731.     2 R = SQRT(-ALOG(A * A))
  1732.       Y = R - (2.30753 + 0.27061 * R) / 
  1733.      *             (1.0 + (0.99229 + 0.04481 * R) * R)
  1734.       IF (PP .GT. 1.0 .AND. QQ .GT. 1.0) GOTO 5
  1735.       R = QQ +QQ
  1736.       T = 1.0 / (9.0 * QQ)
  1737.       T = R * (1.0 - T + Y * SQRT(T)) ** 3
  1738.       IF (T .LE. 0.0) GOTO 3
  1739.       T = (4.0 * PP + R - 2.0) / T
  1740.       IF (T .LE. 1.0) GOTO 4
  1741.       XINBTA = 1.0 - 2.0 / (T + 1.0)
  1742.       GOTO 6
  1743.     3 XINBTA = 1.0 - EXP((ALOG((1.0 - A) * QQ) + BETA) / QQ)
  1744.       GOTO 6
  1745.     4 XINBTA = EXP((ALOG(A * PP) + BETA) / PP)
  1746.       GOTO 6
  1747.     5 R = (Y * Y - 3.0) / 6.0
  1748.       S = 1.0 / (PP + PP - 1.0)
  1749.       T = 1.0 / (QQ + QQ - 1.0)
  1750.       H = 2.0 / (S + T)
  1751.       W = Y * SQRT(H + R) / H - (T - S) * 
  1752.      *   (R + 5.0 / 6.0 - 2.0 / (3.0 * H))
  1753.       XINBTA = PP / (PP + QQ * EXP(W + W))
  1754. C
  1755. C        SOLVE FOR X BY A MODIFIED NEWTON-RAPHSON METHOD,
  1756. C        USING THE FUNCTION BETAIN.
  1757. C
  1758.     6 R = 1.0 - PP
  1759.       T = 1.0 - QQ
  1760.       YPREV = 0.0
  1761.       SQ = 1.0
  1762.       PREV = 1.0
  1763.       IF (XINBTA .LT. 0.0001) XINBTA = 0.0001
  1764.       IF (XINBTA .GT. 0.9999) XINBTA = 0.9999
  1765.     7 Y = BETAIN(XINBTA, PP, QQ)
  1766.       Y = (Y - A) * EXP(BETA +
  1767.      *             R * ALOG(XINBTA) + T * ALOG(1.0 - XINBTA))
  1768.       IF (Y * YPREV .LE. 0.0) PREV = SQ
  1769.       G = 1.0
  1770.     9 ADJ = G * Y
  1771.       SQ = ADJ * ADJ
  1772.       IF (SQ .GE. PREV) GOTO 10
  1773.       TX = XINBTA - ADJ
  1774.       IF (TX .GE. 0.0 .AND. TX .LE. 1.0) GOTO 11
  1775.    10 G = G / 3.0
  1776.       GOTO 9
  1777.    11 IF (PREV .LE. ACU) GOTO 12
  1778.       IF (Y * Y .LE. ACU) GOTO 12
  1779.       IF (TX .EQ. 0.0 .OR. TX .EQ. 1.0) GOTO 10
  1780.       IF (TX .EQ. XINBTA) GOTO 12
  1781.       XINBTA = TX
  1782.       YPREV = Y
  1783.       GOTO 7
  1784.    12 IF (INDEX) XINBTA = 1.0 - XINBTA
  1785.       RETURN
  1786.       END
  1787. C
  1788.       SUBROUTINE MANTEL(IIN,IOUT)
  1789. C
  1790. C        MANTEL-HAENSZEL ESTIMATE OF COMMON ODDS RATIO
  1791. C        MANTEL-HAENSZEL STATISTIC TESTING SIGNIFICANCE OF 
  1792. C          COMMON ODDS RATIO
  1793. C        APPROXIMATE C.I. FOR COMMON ODDS RATIO BASED ON 
  1794. C          FLEISS(1981, EQ. 10.24).  THIS FORMULA CAN ALSO
  1795. C          BE USED TO CONSTRUCT AN APPROXIMATE C.I. FOR A 
  1796. C          SINGLE 2*2 TABLE.
  1797. C
  1798.       LOGICAL LZERO
  1799.       LZERO = .FALSE.
  1800.    90 WRITE(IOUT,100)
  1801.   100 FORMAT(/' Enter the number of 2 * 2 tables:  '$)
  1802.       READ(IIN,*,ERR=90) NTAB
  1803.       IF (NTAB.LT.1 .OR. NTAB.GT.6) GOTO 90
  1804. C
  1805.       SN = 0.0
  1806.       SD = 0.0
  1807.       SNMH = 0.0
  1808.       SDMH = 0.0
  1809.       ODDSN = 0.0
  1810.       ODDSD = 0.0
  1811.       HOMO = 0.0
  1812. C
  1813.       DO 300 K = 1, NTAB
  1814.   110 WRITE (IOUT,120) K
  1815.   120 FORMAT(/' Enter row 1 of table',I2,':  '$)
  1816.       READ(IIN,*,ERR=110) TAB11, TAB12
  1817.   130 WRITE (IOUT,140) K
  1818.   140 FORMAT(' Enter row 2 of table',I2,':  '$)
  1819.       READ(IIN,*,ERR=130) TAB21, TAB22
  1820.       IF (TAB11 * TAB12 * TAB21 * TAB22 .EQ. 0.0) LZERO = .TRUE.
  1821.       SUM = TAB11 + TAB12 + TAB21 + TAB22
  1822. C
  1823. C        MANTEL-HAENSZEL CHI-SQUARE STATISTIC
  1824. C
  1825.       SN = SN + TAB11 - (TAB11 + TAB12) *
  1826.      *   (TAB11 + TAB21) / SUM
  1827.       SD = SD + (TAB11 + TAB12) * (TAB11 + TAB21)
  1828.      *   * (TAB21 + TAB22) * (TAB12 + TAB22) /
  1829.      *   (SUM * SUM * (SUM-1.0))
  1830. C
  1831. C        MANTEL-HAENSZEL ESTIMATE OF COMMON ODDS RATIO
  1832. C
  1833.       SNMH = SNMH + TAB11 * TAB22 / SUM
  1834.       SDMH = SDMH + TAB12 * TAB21 / SUM
  1835. C
  1836. C        C.I. FOR ODDS RATIO BASED ON COMBINING LOG ODDS (FLIESS, 10.20)
  1837. C
  1838.       IF (LZERO) GOTO 300
  1839.       WEIGHT = 1.0 / TAB11 + 1.0 / TAB12 + 1.0 / TAB21 + 1.0 / TAB22
  1840.       WEIGHT = 1.0 / WEIGHT
  1841.       ODDSD = ODDSD + WEIGHT
  1842.       ORATL = ALOG(TAB11 * TAB22 / (TAB12 * TAB21))
  1843.       ODDSN = ODDSN + WEIGHT * ORATL
  1844.       HOMO = HOMO + WEIGHT * ORATL**2
  1845. C
  1846.   300 CONTINUE
  1847. C
  1848. C        MANTEL-HAENSZEL CHI-SQUARE
  1849. C
  1850.       CHISQC = (ABS(SN) - 0.5)**2 / SD
  1851.       PVALC = 2.0 * ALNORM(SQRT(CHISQC),.TRUE.)
  1852.       CHISQ = SN**2 / SD
  1853.       PVAL = 2.0 * ALNORM(SQRT(CHISQ),.TRUE.)
  1854. C
  1855. C        MANTEL-HAENSZEL ESTIMATE
  1856. C
  1857.       IF (SNMH * SDMH .NE. 0.0) GOTO 350
  1858.       WRITE(IOUT,340)
  1859.   340 FORMAT(/' Can''t evaluate odds ratio with counts of 0',
  1860.      *   ' in the summary table.')
  1861.       RETURN
  1862. C
  1863.   350 ODDS = SNMH / SDMH
  1864. C
  1865.       WRITE(IOUT,360) ODDS,CHISQ,PVAL,CHISQC,PVALC
  1866.   360 FORMAT(/' Common odds ratio = ',G12.5//
  1867.      *   ' Mantel-Haenszel chi-square statistic (P-value) '/
  1868.      *   '           uncorrected:  ',G11.4,'  (',F6.4,')'/
  1869.      *   '  continuity corrected:  ',G11.4,'  (',F6.4,')'/)
  1870. C
  1871. C        C.I. FOR COMMON ODDS RATIO
  1872. C
  1873.       IF (LZERO) RETURN
  1874.   410 WRITE(IOUT,420)
  1875.   420 FORMAT(/' Enter desired level of confidence (0,1):  '$)
  1876.       READ(IIN,*,ERR=410) CONF
  1877.       COEF = -GAUINV((1.0 - CONF) / 2.0, IFAULT)
  1878.       CONF = 100.0 * CONF
  1879.       ODDSC = ODDSN / ODDSD
  1880.       ODDSSE = 1.0 / SQRT(ODDSD)
  1881.       CL = EXP(ODDSC - COEF * ODDSSE)
  1882.       CU = EXP(ODDSC + COEF * ODDSSE)
  1883. C
  1884.       WRITE(IOUT,430) CONF,CL,CU
  1885.   430 FORMAT(
  1886.      *   ' Approximate ',F4.1,'-% confidence interval for the odds',
  1887.      *   ' ratio:'/'      (',F7.3,',',F7.3,')')
  1888. C
  1889. C        HOMOGENEITY OF ODDS RATIOS 
  1890. C
  1891.       IF (NTAB.EQ.1) RETURN
  1892.       HOMO = HOMO - ODDSN**2 / ODDSD
  1893.       PHOMO  = CHIDFC(HOMO,NTAB-1)
  1894.       WRITE(IOUT,440) HOMO,PHOMO
  1895.   440 FORMAT(/' Homogeneity of the odds ratios:'/
  1896.      *   '     Chi-square statistic = ',G11.4/
  1897.      *   '     P-value = ',F6.4/)
  1898. C
  1899.       RETURN
  1900.       END
  1901.